// 类型系统
/**
 * 语法： 变量声明：类型 = 值
 * */

// 1. 布尔
let bool: boolean = true
let bool1: boolean = false

// 2. 数字
let num: number = 123


// 3. 字符串
let str1: string = '1231231'
let str2: string = "123123"
let str3: string = `1231231`


// 4. 数组
let arr1: number[] = [1, 2, 3, 4]
let arr2: (number | string)[] = ['a', 'b', 'c', 1231231]

// 5. 元组 Tuple: 是特殊的数组， 有且只有两项
let t1: [number, string] = [1, 'a'];
// React Hooks useState 返回值是一个元组
// const [state, setState] = useState(1)

// 6. 枚举: 其实是一种映射关系
enum Color {
	Red,
	Yellow,
	Green
}

// 7. any: 任意类型， ts会跳过类型检查,
// 一般来讲， 很少使用或者不建议使用
// 但是你可以看到很多第三方库在大量使用 any

let a: any = 1
a = true
a = false
a = '1231'

// 8. void： 特殊情况， 函数没有返回值的类型
function add() { }

const result = add()

// 9. null和undefined
// 9.1 值和类型是一样的 
const u: undefined = undefined
const n: null = null
// 9.2 允许赋值其他类型， 也就说， null和undefined是其他类型的子类型
// 注意需要配置 tsconfig.json=>compilerOptions=>strictNullChecks = false
const s1: number = (undefined)
const s2: Function = (null)

// 10. Never: 表示的是那些永不存在的值的类型

function tt(): never {
	while(true) {

	}
}

function oo(): never {
	throw new Error('报错了');

}

tt()